package controller.simulationcontroller;

import javax.swing.JLabel;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

import model.simulationmodel.ClockHandler;

/**
 * <b>Implementiert:</b> <code>ChangeListener</code> <br>
 * <b>In Verbindung stehende Klassen:</b> <code>ClockHandler</code><br>
 * <br>
 * Listener, der auf dem <code>JSlider</code> zur Regulierung der
 * Simulationsgeschwindigkeit liegt. Hiermit kann der Benutzer die
 * Geschwindigkeit einstellen mit der der <code>ClockHandler</code> seine
 * angemeldeten <code>LogicCLOCK</code>s benachrichtigen soll.
 * 
 * @author Team Locsi
 * 
 */
public class SliderListener implements ChangeListener {

	private ClockHandler cHandler;
	private JLabel valueLabel;

	/**
	 * Dieser Konstruktor erzeugt ein neues <code>SliderListener</code>-Objekt.
	 * 
	 * @param handler
	 *            <code>ClockHandler</code> - Referenz auf den
	 *            <code>ClockHandler</code>
	 * @param valueLabel
	 *            <code>JLabel</code> -Referenz auf das Label des Sliders
	 */
	public SliderListener(ClockHandler handler, JLabel valueLabel) {
		this.cHandler = handler;
		this.valueLabel = valueLabel;
	}

	/**
	 * Setzt die Simulationsgeschwindigkeit im <code>ClockHandler</code>. Wird
	 * aufgerufen wenn der <code>JSlider</code> bewegt wird.
	 */
	@Override
	public void stateChanged(ChangeEvent e) {
		int sliderSpeed = ((JSlider) e.getSource()).getValue();
		cHandler.setSimulationSpeed(getSettedSpeed(sliderSpeed));
		this.valueLabel.setText(getSettedSpeed(sliderSpeed)
				+ " - fache Geschwindigkeit");
	}

	/**
	 * Diese Methode uebersetzt die erhaltenen Werte des JSliders und gibt die
	 * entsprechenden Faktoren zurueck
	 * 
	 * @return <code>double</code> - Faktor der dem gesetzten Wert des JSiders
	 *         entspricht
	 */
	public double getSettedSpeed(int value) {
		double correspondingValue = 1;
		switch (value) {
		case 1:
			correspondingValue = 0.25;
			break;
		case 2:
			correspondingValue = 0.5;
			break;
		case 3:
			correspondingValue = 1.0;
			break;
		case 4:
			correspondingValue = 2.0;
			break;
		default:
			break;
		}
		return correspondingValue;
	}
}
